home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 676-700 / 680 / sattrack / ifflib20.lzh / Examples / EasyExample.c < prev    next >
C/C++ Source or Header  |  1990-07-31  |  3KB  |  109 lines

  1. /*
  2.     EasyExample.c - A simple ILBM file viewer by Christian A. Weber
  3.     This program is in the public domain, use at your own risk.
  4.     Requires the iff.library in the LIBS: dircetory. Compiles with
  5.     Lattice C V5.04 (LC -v -L EasyExample), should also work with Manx.
  6. */
  7.  
  8. #include <exec/types.h>
  9. #include <graphics/gfxbase.h>
  10. #include <intuition/intuition.h>
  11. #include <libraries/iff.h>            /* Our iff header file */
  12.  
  13. struct Library *IntuitionBase,*IFFBase, *OpenLibrary();
  14. struct GfxBase *GfxBase;
  15.  
  16. struct NewScreen ns =
  17. {
  18.     0,0,0,0,0,0,0, NULL, CUSTOMSCREEN|SCREENQUIET, NULL,
  19.     (STRPTR)"Simple ILBM viewer by Christian A. Weber", NULL, NULL
  20. };
  21.  
  22. struct Screen *myscreen, *OpenScreen();
  23. IFFFILE ifffile;
  24.  
  25. void SetOverscan(screen)        /* Adjust the screen position for overscan */
  26. register struct Screen *screen;
  27. {
  28.     register WORD cols,rows,x=screen->Width,y=screen->Height;
  29.     register struct ViewPort *vp=&(screen->ViewPort);
  30.  
  31.     cols = GfxBase->NormalDisplayColumns>>1;
  32.     rows = GfxBase->NormalDisplayRows; if(rows>300) rows>>=1;
  33.     x -= cols; if(vp->Modes & HIRES) x -= cols;
  34.     y -= rows; if(vp->Modes & LACE)  y -= rows;
  35.     x >>=1; if(x<0) x=0; y >>=1; if(y<0) y=0; if(y>32) y=32;
  36.  
  37.     if(vp->Modes & HAM)    /* Correct overscan HAM color distortions */
  38.     {
  39.         if(GfxBase->ActiView->DxOffset-x < 96)
  40.             x=GfxBase->ActiView->DxOffset-96;
  41.     }
  42.     vp->DxOffset = -x; vp->DyOffset = -y;
  43.     MakeScreen(screen); RethinkDisplay();
  44. }
  45.  
  46. void Fail(text)            /* Print error message, free resources and exit */
  47. char *text;
  48. {
  49.     printf("%s, IFFError = %ld\n",text,IFFError());
  50.  
  51.     if(ifffile) CloseIFF(ifffile);
  52.     if(myscreen) CloseScreen(myscreen);
  53.  
  54.     if(IFFBase) CloseLibrary(IFFBase);    /* MUST ALWAYS BE CLOSED !! */
  55.     CloseLibrary(IntuitionBase);
  56.     CloseLibrary(GfxBase);
  57.     exit(0);
  58. }
  59.  
  60. void main(argc,argv)
  61. int argc;
  62. char **argv;
  63. {
  64.     register LONG count,i;
  65.     struct BitMapHeader *bmhd;
  66.     UWORD colortable[128];
  67.  
  68.     if((argc != 2) || !strcmp(argv[1],"?")) {
  69.         printf("Format: %s filename\n",argv[0]);
  70.         exit(20);
  71.     }
  72.  
  73.     GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L);
  74.     IntuitionBase = OpenLibrary("intuition.library",0L);
  75.  
  76.     if(!(IFFBase = OpenLibrary(IFFNAME,IFFVERSION))) {
  77.         printf("Copy the iff.library to your LIBS: directory!\n");
  78.         exit(10);
  79.     }
  80.  
  81.     printf("Loading file %s ... ",argv[1]);
  82.  
  83.     if(!(ifffile=OpenIFF(argv[1]))) Fail("Error opening file");
  84.     if(!(bmhd=GetBMHD(ifffile)))    Fail("BitMapHeader not found");
  85.  
  86.     ns.Width      = bmhd->w;
  87.     ns.Height     = bmhd->h;
  88.     ns.Depth      = bmhd->nPlanes;
  89.     ns.ViewModes  = GetViewModes(ifffile);
  90.  
  91.     if(!(myscreen = OpenScreen(&ns))) Fail("Can't open screen!");
  92.     SetOverscan(myscreen);
  93.  
  94.     count = GetColorTab(ifffile,colortable);
  95.     if(count>32L) count = 32L; /* Some HAM pictures have 64 colors ?! */
  96.     LoadRGB4(&(myscreen->ViewPort),colortable,count);
  97.  
  98.     if(!DecodePic(ifffile,&myscreen->BitMap)) Fail("Can't decode picture");
  99.  
  100.     for(i=0; i<100; ++i)
  101.     {
  102.         if(!((*((UBYTE*)0xbfe001))&64)) break; /* Don't use this in your code! */
  103.         Delay(5L);
  104.     }
  105.  
  106.     Fail("done");     /* Normal termination */
  107. }
  108.  
  109.